package org.alesv.entranceExams.service.security;

import java.util.ArrayList;
import java.util.List;

import org.springframework.security.Authentication;
import org.springframework.security.GrantedAuthority;
import org.springframework.security.GrantedAuthorityImpl;

/**
 * Clase que representa a un usuario autenticado en la aplicación.
 */
public class UserAuthentication implements Authentication {

    /**
     * Rol básico.
     */
    public static final String                 ROLE_USER        = "ROLE_USER";

    /**
     * Identificador del rol básico.
     */
    public static final int                    ROLE_USER_ID     = 1;

    /**
     * Valor para la serialización.
     */
    private static final long                  serialVersionUID = -7751987079275890158L;

    /**
     * Nombre del usuaro.
     */
    private transient final String             nombre;

    /**
     * Roles asignados al usuario.
     */
    private transient final GrantedAuthority[] authorities;

    /**
     * Constructor.
     * 
     * @param idRol
     *            idRol.
     * @param nombre
     *            nombre.
     * @return UserAuthentication
     */
    public UserAuthentication(final int idRol, final String nombre) {
        this.nombre = nombre;
        final List<GrantedAuthority> authList = new ArrayList<GrantedAuthority>();

        // Por tener sólo un caso, uso un if, pero si tubiesemos más de tres, pasaríamos a usar un switch (orden del
        // PMD)

        if (idRol == ROLE_USER_ID) {
            authList.add(new GrantedAuthorityImpl(ROLE_USER));
        }

        // switch (idRol) {
        // case ROLE_USER_ID:
        // authList.add(new GrantedAuthorityImpl(ROLE_USER));
        // break;
        // default:
        // // do nothing
        // break;
        // }

        this.authorities = authList.toArray(new GrantedAuthority[] {});
    }

    @Override
    public final GrantedAuthority[] getAuthorities() {
        // TODO Auto-generated method stub
        return this.authorities;
    }

    @Override
    public final Object getCredentials() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public final Object getDetails() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public final Object getPrincipal() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public final boolean isAuthenticated() {
        // TODO Auto-generated method stub
        return true;
    }

    @Override
    public final void setAuthenticated(final boolean arg0) {
        // TODO Auto-generated method stub

    }

    /**
     * @return String
     */
    public String getRol() {
        String result = "";
        if (this.authorities.length == 1) {
            result = this.authorities[0].getAuthority();
        }
        return result;
    }

    /**
     * @return String
     */
    public String getNombre() {
        return this.nombre;
    }

    @Override
    public String getName() {
        // TODO Auto-generated method stub
        return null;
    }

}
